//
//  HMHMStatusListVM.swift
//  HMWeibo12
//
//  Created by iOS on 16/9/20.
//  Copyright © 2016年 iOS. All rights reserved.
//

import UIKit

/// 负责微博数据的加载和转模型,发布微博
class HMHMStatusListVM: NSObject {

    // 单例
    static let shared: HMHMStatusListVM = HMHMStatusListVM()
    
    // 下拉刷新和上拉加载更多可能同时调用loadStatuses方法
    /// 是否在加载数据
    private var isLoading = false
    
    fileprivate override init() {
        super.init()
    }
    
    /// 加载微博数据
    func loadStatuses(since_id: Int64, max_id: Int64, completion: @escaping ([HMStatusVM]?, Error?) -> Void) -> Void {
        
        if isLoading {
            // 有人正在请求数据,直接返回,通过闭包,返回东西?
            // domain: 错误范围,自定义
            // code: 表示错误编码,自定义
            // userInfo: 错误附带的信息
            let error = NSError(domain: "cn.itheima.loadStatus", code: -2, userInfo: ["错误信息" : "亲,请手速不要太快"])
            completion(nil, error)
            return
        }
        
        isLoading = true
        
        // 调用dal的方法去加载微博数据
        HMStatusDAL().dalLoadStatus(since_id: since_id, max_id: max_id) { (statuses: [[String : Any]]?, error: Error?) in
            self.isLoading = false
            
            if error != nil {
                print("加载微博数据失败了: \(error)")
                completion(nil, error)
                return
            }
            
            if statuses == nil || statuses!.count == 0 {
                print("没有加载到微博数据")
                completion(nil, nil)
                return
            }
            
            // 子线程字典转模型
            DispatchQueue.global().async(execute: { 
                // 创建数组
                var statusVMs = [HMStatusVM]()
                
                for dict in statuses! {
                    // 转成微博模型
                    let status = HMStatus(dcit: dict)
                    // 微博模型对应VM
                    let statusVM = HMStatusVM(status: status)
                    
                    statusVMs.append(statusVM)
                }
                
                // 回到主线程
                DispatchQueue.main.async(execute: {
                    // 字典转模型就完成了
                    completion(statusVMs, nil)
                })
            })
        }
    }
    
    
    /// 发布微博
    ///
    /// - parameter status: 微博的文本内容
    func sendStatus(status: String, image: UIImage?, completion: @escaping (Error?) -> Void) -> Void {
        
        guard let access_token = HMUserAccountVM.shared.userAccount?.access_token else {
            print("access_token 没有值")
            return
        }
        
        
        // 参数
        let parameter = [
            "access_token": access_token,
            "status": status
        ]
        
        if let image = image {
            // 传入了图片,发送带图片的微博
            let urlString = "https://upload.api.weibo.com/2/statuses/upload.json"
            
            HMNetworkTool.shared.post(URLString: urlString, parameters: parameter, constructingBodyWith: { (formData) in
                let data = UIImagePNGRepresentation(image)!
                // 上传图片的二进制
                // withFileData: 图片的二进制
                // name: 上传参数的名称,需要查看API文档
                // fileName: 上传后的文件名称,如果文档没有规定,可以不填,服务器会自己拿到上传的图片重命名
                // mimeType: 文件类型 image/png, image/jpeg, image/gif
                formData.appendPart(withFileData: data, name: "pic", fileName: "", mimeType: "image/png")
                }, success: { (_, result) in
                    print("发布带图片微博成功了: \(urlString)")
                    completion(nil)
                }, failure: { (_, error) in
                    completion(error)
            })
            
        } else {
            // url
            let urlString = "statuses/update.json"
            
            // 普通的文本微博
            // 发送请求
            HMNetworkTool.shared.request(method: .POST, URLString: urlString, parameters: parameter, progress: nil, success: { (_, result) in
                print("发布微博成功了: \(urlString)")
                completion(nil)
            }) { (_, error) in
                completion(error)
            }
        }
    }
}
